<HTML>
<HEAD>
<!-- This HTML file has been created by texi2html 1.29
     from lidoref.tnf on 19 December 2010 -->

<TITLE>LIDO - Reference Manual - Rule Specifications</TITLE>
</HEAD>
<BODY TEXT="#000000" BGCOLOR="#FFFFFF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF0000" BACKGROUND="gifs/bg.gif">
<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0" VALIGN=BOTTOM>
<TR VALIGN=BOTTOM>
<TD WIDTH="160" VALIGN=BOTTOM>
<A HREF="http://eli-project.sourceforge.net/">
<IMG SRC="gifs/elilogo.gif" BORDER=0>
</A>&nbsp;
</TD>
<TD WIDTH="25" VALIGN=BOTTOM>
<img src="gifs/empty.gif" WIDTH=25 HEIGHT=25>
</TD>
<TD ALIGN=LEFT WIDTH="475" VALIGN=BOTTOM>
<A HREF="index.html"><IMG SRC="gifs/title.png" BORDER=0></A>
</TD>
<!-- |DELETE FOR SOURCEFORGE LOGO|
<TD>
<a href="http://sourceforge.net/projects/eli-project">
<img
  src="http://sflogo.sourceforge.net/sflogo.php?group_id=70447&amp;type=13"
  width="120" height="30"
  alt="Get Eli: Translator Construction Made Easy at SourceForge.net.
    Fast, secure and Free Open Source software downloads"/>
</a>
</TD>
|DELETE FOR SOURCEFORGE LOGO| -->
</TR>
</TABLE>

<HR size=1 noshade width=785 align=left>
<TABLE BORDER=0 CELLSPACING=2 CELLPADDING=0>
<TR>
<TD VALIGN=TOP WIDTH="160">
<h4>General Information</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="index.html">Eli: Translator Construction Made Easy</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gindex_1.html#SEC1">Global Index</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="faq_toc.html" >Frequently Asked Questions</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Tutorials</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="EliRefCard_toc.html">Quick Reference Card</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="novice_toc.html">Guide For new Eli Users</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="news_toc.html">Release Notes of Eli</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="nametutorial_toc.html">Tutorial on Name Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="typetutorial_toc.html">Tutorial on Type Analysis</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Reference Manuals</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ui_toc.html">User Interface</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="pp_toc.html">Eli products and parameters</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lidoref_toc.html">LIDO Reference Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ee.html" >Typical Eli Usage Errors</a> </td></tr>
</table>

<h4>Libraries</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lib_toc.html">Eli library routines</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="modlib_toc.html">Specification Module Library</a></td></tr>
</table>

<h4>Translation Tasks</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lex_toc.html">Lexical analysis specification</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="syntax_toc.html">Syntactic Analysis Manual</a></td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="comptrees_toc.html">Computation in Trees</a></td></tr>
</table>

<h4>Tools</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="lcl_toc.html">LIGA Control Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="show_toc.html">Debugging Information for LIDO</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="gorto_toc.html">Graphical ORder TOol</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="fw_toc.html">FunnelWeb User's Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="ptg_toc.html">Pattern-based Text Generator</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="deftbl_toc.html">Property Definition Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="oil_toc.html">Operator Identification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="tp_toc.html">Tree Grammar Specification Language</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="clp_toc.html">Command Line Processing</a> </td></tr>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="cola_toc.html">COLA Options Reference Manual</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="idem_toc.html">Generating Unparsing Code</a> </td></tr>
</table>
<p>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="mon_toc.html">Monitoring a Processor's Execution</a> </td></tr>
</table>

<h4>Administration</h4>

<table BORDER=0 CELLSPACING=0 CELLPADDING=0>
<tr valign=top><td><img src="gifs/gelbekugel.gif" WIDTH=7 HEIGHT=7 ALT=" o"> </td><td><a href="sysadmin_toc.html">System Administration Guide</a> </td></tr>
</table>

<HR WIDTH="100%">
<A HREF="mailto:eli-project-users@lists.sourceforge.net">
<IMG SRC="gifs/button_mail.gif" BORDER=0 ALIGN="left"></A>
<A HREF="index.html"><IMG SRC="gifs/home.gif" BORDER=0 ALIGN="right"></A>

</TD>
<TD VALIGN=TOP WIDTH="25"><img src="gifs/empty.gif" WIDTH=25 HEIGHT=25></TD>

<TD VALIGN=TOP WIDTH="600">
<H1>LIDO - Reference Manual</H1>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="lidoref_2.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="lidoref_4.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="lidoref_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
<H1><A NAME="SEC3" HREF="lidoref_toc.html#SEC3">Rule Specifications</A></H1>
<P>
A rule specification specifies a production of the tree grammar, and may
associate some computations with the rule context. They are executed in 
every context which represents that rule in a particular tree.
<A NAME="IDX9"></A>
<A NAME="IDX10"></A>
<A NAME="IDX8"></A>
<P>
<H4>Syntax</H4>
<PRE>
    RuleSpec ::= 'RULE' [RuleName] ':' Production Computations 'END'
</PRE>
<P>
Example:
<PRE>
    RULE p: Stmt  ::= 'while' Expr 'do' Stmt COMPUTE
      Expr.postType = boolType
    END;
</PRE>
<P>
There may be several rule specifications that refer to the same rule.
In that case the associated computations are accumulated.
<P>
The set of productions of all rules forms the tree grammar. It must
have exactly one root symbol that does not occur on any right-hand
side of a production.
<A NAME="IDX11"></A>
<P>
Eli usually generates some rule specifications (without computations)
from the concrete grammar in order to complete the tree grammar.
<A NAME="IDX13"></A>
<A NAME="IDX12"></A>
<P>
In general the <CODE>RuleName</CODE> is omitted. The rule is then identified
by the production. LIGA generates a name of the form <CODE>rule_i</CODE>, with
a unique number <CODE>i</CODE> for such a rule.
A meaningful <CODE>RuleName</CODE> should be specified for rules that are
part of computed subtrees, since the name of the tree construction
function is derived from it (see  <A HREF="lidoref_10.html#SEC18">Computed Subtrees</A>).
Also using the <CODE>RuleFct</CODE> feature may give rise to explicitly
name rules (see  <A HREF="lidoref_12.html#SEC21">Predefined Entities</A>).
<A NAME="IDX14"></A>
<P>
<H4>Restrictions</H4>
<P>
Two unnamed rule specifications refer to the same rule if their productions
are identical.
<P>
A named rule specification and an unnamed one refer to the same rule if
their productions are identical. In that case there must not be another
rule specification with the same production but a different name.
<P>
Two named rule specifications with the same <CODE>RuleName</CODE> must have
the same production.
<P>
Note: Two rule specifications with different names, but equal productions, are
only reasonable if they belong to computed subtrees rather to subtrees
constructed by a parser.
<A NAME="IDX16"></A>
<A NAME="IDX15"></A>
<P>
<H2><A NAME="SEC4" HREF="lidoref_toc.html#SEC4">Productions</A></H2>
<P>
A production as part of a rule specification describes the structure
of the rule context. Computations associated with the rule may use or define
attributes of nonterminal symbols that occur in the production. The set
of all productions in a LIDO specification defines the tree grammar.
<A NAME="IDX18"></A>
<A NAME="IDX17"></A>
<P>
<H4>Syntax</H4>
<PRE>
    Production     ::= SymbName '::=' Symbols
                     | SymbName 'LISTOF' Elements

    Symbols        ::= Symbols Symbols |
                     | SymbName | Literal

    Elements       ::=  Elements '|' Elements |
                     | SymbName

    TermSpec       ::= 'TERM' SymbNames ':' TypeName
<A NAME="IDX19"></A>
<A NAME="IDX20"></A>
<A NAME="IDX21"></A>
<A NAME="IDX22"></A>
<A NAME="IDX23"></A>
<A NAME="IDX24"></A>
</PRE>
<P>
<H4>Examples</H4>
<P>
<PRE>
    Stmt ::= 'while' Expr 'do' Stmt
    DefIdent ::= Identifier
    Declarations LISTOF ProcDecl | VarDecl
    TERM Identifier: int;
</PRE>
<P>
Productions are composed of nonterminal symbols, named terminal symbols,
and literal terminals.
<A NAME="IDX26"></A>
<A NAME="IDX25"></A>
<P>
The <CODE>SymbName</CODE> on the left-hand side of a production is a nonterminal.
A <CODE>SymbName</CODE> that does not occur on the left-hand side of any production
denotes a named terminal. A nonterminal symbol that does not occur on
the right-hand side of any production is the root of the tree grammar.
<P>
We say the rule context is a <DFN>lower context</DFN> for the left-hand side 
nonterminal, and an <DFN>upper context</DFN> for any right-hand side 
nonterminal.
<P>
Literal terminals are denoted by arbitrary non empty strings enclosed in
single quotes. A quote that is part of such string is denoted by two single
quotes.
<A NAME="IDX27"></A>
<P>
Literal terminals do not contribute to the trees specified by the tree
grammar. They only relate tree productions to concrete productions
describing the input text, and distinguish otherwise equal productions.
<P>
Named terminal symbols do not contribute to the trees specified by the
tree grammar. They are related to named terminal symbols of corresponding
concrete productions describing the input text. A value derived from such an
input token may be used in computations which are associated with the rule of the
production or with the symbol on the left-hand side of the production. (If
the tree context is constructed by a computation, rather than by parsing the
input text, then that value is supplied as an argument to the call of the
construction function (see  <A HREF="lidoref_10.html#SEC19">Tree Construction Functions</A>).)
<A NAME="IDX28"></A>
<P>
The type of the value provided by a named terminal symbol is specified
by a <CODE>TERM</CODE> specification. If there is no such specification the type
<CODE>int</CODE> is assumed.
<P>
There are two forms of productions: plain productions and <CODE>LISTOF</CODE>
productions.
<P>
A plain production defines tree contexts with a node for the left-hand side
nonterminal having a sequence of subtrees, one for each nonterminal
on the right-hand side.
<P>
Computations may refer to any attribute of any nonterminal in the production.
If one nonterminal occurs more than once in the production references to
the occurrences in computations are distinguished by indices (starting
from 1).
<P>
A <CODE>LISTOF</CODE> production defines tree contexts with a node for the
left-hand side nonterminal having an arbitrary long sequence of subtrees each
rooted by a nonterminal specified as a <CODE>LISTOF</CODE> element. That
sequence may be empty, even if there is no empty <CODE>LISTOF</CODE> element
specified.
<A NAME="IDX29"></A>
<P>
Computations associated with the rule of a <CODE>LISTOF</CODE> production may only
refer to attributes of the left-hand side symbol. Attributes of the
element subtrees are referenced only by remote attribute access
(see  <A HREF="lidoref_9.html#SEC14">Remote Attribute Access</A>).
<P>
<H4>Restrictions</H4>
<P>
There must be exactly one root nonterminal which does not occur on any
right-hand side of a tree grammar production.
<A NAME="IDX30"></A>
<P>
If <CODE>X</CODE> is the left-hand side symbol of a <CODE>LISTOF</CODE> production,
then there may not be a different production (neither <CODE>LISTOF</CODE> nor
plain) that also has <CODE>X</CODE> on its left-hand side.
<P>
Named terminals may not be <CODE>LISTOF</CODE> elements.
<P>
A literal terminal may not be the empty string.
<P>
<HR size=1 noshade width=600 align=left>
<P>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="lidoref_2.html"><IMG SRC="gifs/prev.gif" ALT="Previous Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="lidoref_4.html"><IMG SRC="gifs/next.gif" ALT="Next Chapter" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT=""><A HREF="lidoref_toc.html"><IMG SRC="gifs/up.gif" ALT="Table of Contents" BORDER="0"></A>
<IMG SRC="gifs/empty.gif" WIDTH=25 HEIGHT=25 ALT="">
<HR size=1 noshade width=600 align=left>
</TD>
</TR>
</TABLE>

</BODY></HTML>
